var usb;
var boxPort;
var boxBps;
var btnRefresh;
var btnATF;
var btnLoadConfigFile;
var btnSaveConfigToFile;
var btnRestart;
var btnConfigMode;
//菜单、tab控件
var menuData = [];
var menu;
var tabs;
//状态提示栏控件
var labelMode;
var labelDevice;
var labelLastCmd;
var progressBar;
var dumped = false; //刷新中
var currentPage = null; //当前配置页
var receivers = []; //接收者（方法）
var lineReceivers = []; //行接收者(方法)
var AllowMainApplicationClose = true; //允许被主程序关闭
var timer; //被串口发送"js:setInterval();"这个方法调用，然后可以js:clearInterval(timer)清除
// 用于存储最后一次的刷新数据
var lastDumpData = new Map();
var lastLoginTime = new Date().getTime();

//窗口加载完成
window.onload = function () {
    //初始化控件
    menu = $("#sm");
    boxPort = $("#boxPort");
    boxBps = $("#boxBps");
    usb = $("#usb");
    btnRefresh = $("#btnRefresh");
    btnATF = $("#btnATF");
    btnLoadConfigFile = $("#btnLoadConfigFile");
    btnSaveConfigToFile = $("#btnSaveConfigToFile");
    btnRestart = $("#btnRestart");
    btnConfigMode = $("#btnConfigMode");
    tabs = $("#tabs");
    labelMode = $("#labelMode");
    labelLastCmd = $("#labelLastCmd");
    labelDevice = $("#labelDevice");
    progressBar = $("#progressBar");
    Device.modeLinkElement = btnConfigMode;
    //事件绑定
    usb.click(openPort);
    boxBps.combobox({ "value": (typeof Device.defaultBps == "undefined") ? 57600 : Device.defaultBps });
    boxBps.combobox({
        onChange: function () {
            SetPortBps($(this).val(), "", "alert");
        },
    });
    btnRefresh.click(function () {
        sendCmd("DUMPS");
    });
    btnATF.click(function () {
        sendCmds(["ATF", "DUMPS"]);
    });
    btnRestart.click(function () {
        sendCmd("RST");
    });
    btnConfigMode.click(function () {
        Device.changeConfigMode();
    });
    btnLoadConfigFile.click(loadConfigFile);
    //保存配置到文件
    btnSaveConfigToFile.click(CmdPage.saveAllPageCmd);
    //未实现的功能点击提示
    $(".disabled").click(function () {
        alert(i18n.lan.msg.disabled);
    });
    //进度条点击事件
    progressBar.click(function () {
        if ($(this).val % 100 != 0) {
            CancelAfterCmds("");
        }
    });

    initTabsClickEvent();
    //数据加载
    initLanguage();
    initMenu();
    SetTitle(document.title);
    //发送多条指令时，每条指令执行时的超时时间(秒)
    SetCmdExecTimeout(10, "", "alert");
    // getUseablePorts(); //串口数据
    GetPortNames("", "updatePorts", "alert");
};

//初始化tabs标签点击事件(双击事件)
function initTabsClickEvent() {
    //easyui tabs双击事件声名
    $.extend($.fn.tabs.methods, {
        bindDblclick: function (jq, caller) {
            return jq.each(function () {
                var that = this;
                $(this)
                    .children("div.tabs-header")
                    .find("ul.tabs")
                    .undelegate("li", "dblclick.tabs")
                    .delegate("li", "dblclick.tabs", function (e) {
                        if (caller && typeof caller == "function") {
                            var title = $(this).text();
                            var index = $(that).tabs(
                                "getTabIndex",
                                $(that).tabs("getTab", title)
                            );
                            caller(index, title);
                        }
                    });
            });
        },
    });
    //双击事件绑定
    $(function () {
        $("#tabs").tabs("bindDblclick", function (index, title) {
            // $('#tabs').tabs("close", title);//关闭点击的
            $(".tabs li").each(function (index, obj) {
                //获取所有可关闭的选项卡
                var tabTitle = $(".tabs-closable", this).text();
                if (tabTitle) {
                    //内容不为空（表示可以关闭）
                    if (tabTitle != i18n.lan.menu.PageComTool)
                        //串口工具双击不会被关闭
                        $("#tabs").tabs("close", tabTitle);
                }
            });
            currentPage = CmdPage.getPageByTitle(
                tabs.tabs("getSelected").panel("options").title
            );
        });
    });
    tabs.tabs({
        onSelect: function (title, index) {
            //从存在的刷新数据中更新页面
            currentPage = CmdPage.getPageByTitle(title);
            //防止tabs中的datagrid变为一条线
            //在tab页显示前，父元素是不可见的，大小为0,0，所以datagrid下的所有元素大小也为0,0，导致不可见
            if (currentPage && currentPage.dgData) {
                //有表格
                $("#" + currentPage.id + "_dg").datagrid("resize");
            }
        },
    });
}

//执行配置文件
function loadConfigFile() {
    LoadConfigFile("", "cmdProgressChanged", "alert");
}

//保存配置指令到文件
function saveCmdsToFile(data) {
    SaveCmdsToFile(data, "saveCmdsToFileSuccess", "alert");
}
//指令保存完成
function saveCmdsToFileSuccess(data) {
    alert(i18n.lan.msg.saveCmdsToFileSuccess + $.parseJSON(data).filename);
}
//系统调用：更新端口
function updatePorts(data) {
    try {
        // var ports = $.parseJSON(data);
        let ports = data.split(",");
        boxPort.combobox("clear");
        boxPort.combobox("loadData", []); //防止上面清空后下拉中还有
        if (ports.length > 0) {
            var items = [];
            $.each(ports, function (i, item) {
                items.push({
                    id: item,
                    text: item,
                });
            });
            boxPort.combobox("loadData", items);
            boxPort.combobox("setValue", items[0].id);
        }
    } catch (error) {
        alert(error);
    }
}
//打开端口
function openPort() {
    var data = new Object();
    data.com = boxPort.combobox("getValue");
    data.bps = boxBps.combobox("getValue");
    if (data.com) {
        if (usb.hasClass("usbOpened")) {
            ClosePort(JSON.stringify(data), "comPortStateChanged");
        } else {
            OpenPort(JSON.stringify(data), "comPortStateChanged");
        }
    } else {
        alert(i18n.lan.PageComTool.noComPort);
        GetPortNames("", "updatePorts", "alert");
    }
}

//端口变更（插入或拔出）
// function comPortChanged(msg){
//     var nowCom = usb.val();//当前端口
// }

//端口状态变更
function comPortStateChanged(msg) {
    var data = $.parseJSON(msg);
    if (data.state == true.toString()) {
        usb.addClass("usbOpened");
    } else {
        usb.removeClass("usbOpened");
    }
    //上面的addClass不生效（c#）
    usb.attr(
        "src",
        "images/" +
        (data.state == true.toString() ? "usb_conn.png" : "usb_disconn.png")
    );
}
//端口是否打开
function isPortOpen() {
    return usb.attr("src") == "images/usb_conn.png";
}

//发送指令(添加%和回车)
function sendCmd(data) {
    sendData(Device.addCmdHE(data));
}
//发送数据
function sendData(data) {
    if (isPortOpen()) {
        SendData(data);
    } else {
        alert(i18n.lan.msg.portNotOpen);
        // alert(data);
    }
    labelLastCmd.text(data);
}
//发送多条指令(会添加%和回车)
function sendCmds(cmds) {
    for (var i in cmds) {
        cmds[i] = Device.addCmdHE(cmds[i]); //添加%和回车
    }
    // if (isSystemMethodOk()) {
    if (isPortOpen()) {
        SendCmds(JSON.stringify(cmds), "cmdProgressChanged");
    } else {
        if (boxPort[0].options.length > 0) {
            alert(i18n.lan.msg.portNotOpen);
        } else {
            alert(cmds.join(""));
        }
    }
    // } else {
    //     alert(cmds);
    // }
}
//命令执行进度更新
function cmdProgressChanged(percent) {
    progressBar.val(parseInt(percent) % 100); // % 100;
    if (percent > 0) {
        progressBar.show();
    } else if (percent % 100 == 0) {
        progressBar.fadeOut();
    }
    // percent % 100 == 0 ? progressBar.fadeOut() : progressBar.show();
}
//单页面刷新事件
function refreshClick(btn) {
    CmdPage.clearPageData(eval($(btn).attr("page"))); // 清空页面上的数据
    var cmds = $(btn).attr("cmd").split(","); //取出刷新指令
    //单刷新指令
    if (cmds.length == 1) {
        sendCmd(cmds[0]);
    }
    //多刷新指令
    else {
        sendCmds(cmds);
    }
}
//后台正忙
function cmdWorkerBusy() {
    alert(i18n.lan.msg.cmdWorkerBusy);
}
//后台指令执行完成
function cmdWorkerOk() {
    labelLastCmd.text(i18n.lan.msg.cmdWorkerOk);
}

//接收到串口数据
function dataReceived(msg) {
    //查找所有接收者
    for (let i in receivers) {
        // 防止页面被关闭
        if (receivers[i]) {
            receivers[i](msg);
        }
    }
}

//接收到完成的行(串口数据提取出的行)
function newLineReceived(line) {
    if (line.startsWith("Press '%")) {
        Device.currentMode = 1; //复位到工作模式
        labelMode.text("");
        // 要求进入配置模式
        if (Device.configMode) {
            sendData("%%%%%%%%%%"); //进入配置
            labelMode.text(i18n.lan.msg.tryGotoConfigMode);
            Device.setConfigMode(false);
        }
    }
    //检测进入配置模式
    else if (line.startsWith("DTU come in setup mode")) {
        labelMode.text(i18n.lan.msg.configMode);
        Device.currentMode = 0;
    }
    //正在进入工作模式
    else if (line.startsWith("Waiting for Simcard")) {
        labelMode.text(i18n.lan.msg.tryGotoWorkMode);
    }
    //检测要求输入密码
    else if (
        line.startsWith("Console started, please login") ||
        line.startsWith("please input password")
    ) {
        sendData("000000\n");
    }
    //密码验证ok
    else if (line.startsWith("Login Success")) {
        Device.dumpData.clear();
        if (Device.currentMode) {
            labelMode.text(i18n.lan.msg.workMode);
        } else {
            labelMode.text(i18n.lan.msg.configModeOk);
            //if(!defined(PageTest)){//无效？
            if (typeof PageTest == "undefined") {
                sendCmd("DUMPS");
            }
        }
    }
    // 这个也用于检测尝试密码登陆
    else if (line.startsWith("Login Failed")) {
        // 10秒内不重发
        if (new Date().getTime() - lastLoginTime > 10000) {
            lastLoginTime = new Date().getTime();
            sendData("000000\n");
        }
    }
    //设备名
    else if (line.startsWith("CWT-") || line.startsWith("S4421")) {
        labelDevice.text(line);
        Device.typeDesc = line;
    }
    // 设备语言:开机检查
    else if (line.startsWith("Load Charset")) {
        // 英文
        if (line.startsWith("Load Charset 1")) {
            Device.needTransCode = false;
        } else if (line.startsWith("Load Charset 2")) {
            Device.needTransCode = true;
        }
    } else if (line.startsWith("   Charset: AscII code English")) {
        Device.needTransCode = false;
    }
    //刷新出的指令
    else if (line[0] == "$" || (line[0] == "*" && line[1] != "*")) {
        let thisData = Device.addDumpData(line);
        // Object.assign(lastDumpData,thisData);//不支持，参考网上的实现也不能调用?
        thisData.forEach(function (value, key) {
            if (lastDumpData.has(key)) {
                lastDumpData[key] = value;
            } else {
                lastDumpData.set(key, value);
            }
        });
        // 如果直接在这里CmdPage.updatePageByDumpData()在dump_core时会卡住
    }
    //刷新指令
    else if (line[0] == "%" && (line.indexOf("DUMP") != -1 || line.indexOf("dump") != -1)) {
        dumped = true;
        progressBar.show();
    }
    //收到CMD OK
    else if (line.startsWith("CMD OK") || line.startsWith("CMD ERR")) {
        if (dumped) {
            //关闭刷新提示
            dumped = false;
            progressBar.val(100);
            progressBar.fadeOut();
            var allTab = tabs.tabs("tabs");
            let pages = [];
            let title;
            for (let i in allTab) {
                title = allTab[i].panel("options").title;
                if (title) {
                    pages.push(CmdPage.getPageByTitle(title));
                }
            }
            // 可能需要更新语言：刷新检查
            if (lastDumpData.has("SMSCharsetID")) {
                Device.needTransCode = lastDumpData.get("SMSCharsetID") == "2";
            }
            CmdPage.updatePageByDumpData(pages, lastDumpData); //null:匹配所有dump控件
            lastDumpData = new Map();
        }
    }
    // 工作模式（刷新时的提示）
    else if (line.startsWith("$SYSMODE 1")) {
        labelMode.text(i18n.lan.msg.workMode);
    }
    //其它接收者
    lineReceivers.forEach(function (fun) {
        if (fun) {
            fun(line);
        }
    });
    // for (let i in lineReceivers) {
    //     lineReceivers[i](line);
    // }
}

//初始化菜单
function initMenu() {
    //加载一级菜单
    CmdPage.menus.forEach(function (key) {
        var menu = {
            text: eval(key), //标题
            state: "close", //是否展开
            iconCls: "icon-me-setting", //图标
            children: [], //子菜单
        };
        CmdPage.menus.set(key, menuData.length); //index记录
        menuData.push(menu);
    });
    //加载二级菜单(页面)
    for (var i = 0; i < CmdPage.pages.length; i++) {
        var children = {
            text: eval(CmdPage.pages[i].title), //标题
            iconCls: CmdPage.pages[i].icon, //图标
            page: CmdPage.pages[i].id, //点击时方便打开页面
            closable: defined(CmdPage.pages[i].closable) ? CmdPage.pages[i].closable : true, //默认允许关闭
        };
        //修改一级菜单图标
        if (defined(CmdPage.pages[i].parentIcon)) {
            menuData[CmdPage.menus.get(CmdPage.pages[i].menu)].iconCls =
                CmdPage.pages[i].parentIcon;
        }
        //添加二级菜单到一级
        menuData[CmdPage.menus.get(CmdPage.pages[i].menu)].children.push(children);
        //是否需要自动打开
        if (CmdPage.pages[i].autoOpen) {
            openPage(children);
        }
    }
    if (menuData.length > 0) menuData[0].state = "open"; //展开第一个菜单
    menu.sidemenu({
        data: menuData,
    }); //菜单数据
}

//打开页面
function openPage(menuItem) {
    currentPage = CmdPage.getPageByTitle(menuItem.text);
    //已经存在tabs中
    if (tabs.tabs("getTab", menuItem.text)) {
        tabs.tabs("select", menuItem.text); //选中
    }
    //添加一个tab
    else {
        tabs.tabs("add", {
            title: menuItem.text, //tab标题
            content: CmdPage.createBody(eval(menuItem.page)), //页面内容
            closable: menuItem.closable, //默认可关闭
            iconCls: eval(menuItem.page).icon, //图标
        });
        CmdPage.updatePageByDumpData([currentPage], Device.dumpData);
    }
}

//获得可用端口
function getUseablePorts() {
    GetPortNames("", "updatePorts", "alert");
}

//初始化语言(自动)
function initLanguage() {
    i18n.load();
    //easyui的tabs标题修改（easyui会先加载）
    // var titles = $("#tabs").find('.tabs-header:first').find('.tabs-title');
    // titles.eq(0).text(i18n.lan.comTool.title);
}

//请求主程序使用websocket方式(createWeb是否创建页面true/false)
//例如在发送区输入js:web()
function web(createWeb) {
    //port:0表示使用系统定义的端口；createWeb:true/false,打开web页面
    UseBrowser(JSON.stringify({ port: 0, createWeb: createWeb }), "showWebSocket", "alert");
}
//主程序调用：显示websocket参数(msg格式为192.168.1.100:54421)
function showWebSocket(msg) {
    let vals = msg.split(":");
    //生成连接websocket的消息=>js:connWeb("192.168.1.100",54421)
    if (typeof taSend != "undefined") {
        taSend.append('\r\njs:connWeb("{0}",{1})'.format(vals[0], vals[1]));
    }
}

//手动连接websocket
//例如在发送区输入js:connWeb("192.168.1.182",54421)然后发送
function connWeb(ip, port) {
    ip = defined(ip) ? ip : "192.168.1.182";
    port = defined(port) ? port : 54421;
    AllowMainApplicationClose = false; //手动连接的不需要被主程序关闭
    myWebSocket_Connect(ip, port);
}

//主程序调用：关闭窗口
function closeWindow(msg) {
    if (AllowMainApplicationClose) {
        window.opener = null;
        window.open("", "_self");
        window.close();
    }
}

//修改日志输出
if (isSystemMethodOk()) {
    console.log = function () {
        let msg = "";
        for (let i = 0; i < arguments.length; i++) {
            if (i != 0) msg += " ";
            msg += arguments[i];
        }
        msg += "\n";
        taSend.append(msg);
    };
}
//错误提示
window.onerror = function (err) {
    alert(err);
};

/**
 * 发送文件
 * @param {文件名} filename
 * @param {如果大于0表示分段发送} partLen
 * @param {要上传的分段序号}} index
 */
function sendFile(filename, partLen, index, successMethod, errorMethod) {
    let data = { filename: filename, partLen: partLen };
    if (typeof index != "undefined") {
        data.index = index;
    }
    if (typeof errorMethod == "undefined") {
        errorMethod = "alert";
    }
    SendFile(JSON.stringify(data), successMethod, errorMethod);
}
